package com.example.demo.service;

import java.io.UnsupportedEncodingException;
import java.time.LocalDate;
import java.util.Map;

/**
 * 签到
 */
public interface SignService {

    /**
     * 签到
     *
     * @param userId
     * @param localDate
     * @return
     */
    Boolean doSign(String userId, LocalDate localDate);

    /**
     * 检查用户是否签到
     *
     * @param userId    用户ID
     * @param localDate 日期
     * @return 当前的签到状态
     */
    boolean checkSign(String userId, LocalDate localDate);

    /**
     * 获取用户当月签到次数
     *
     * @param userId
     * @param localDate 可以传当月的任意天数日期
     * @return
     */
    Long getSignCount(String userId, LocalDate localDate);


    /**
     * 获取当月连续签到次数
     *
     * @param userId    用户ID
     * @param localDate 日期 传实际需要校验的那天
     *                  比如 20210701 20210702 20210704签到了
     *                  输入20210702签到两天
     *                  输入20210703签到两天
     *                  输入20210704签到一天
     * @return 当月连续签到次数
     */
    long getContinuousSignCount(String userId, LocalDate localDate);


    /**
     * 获取用户当月首次签到日期
     *
     * @param uid  用户ID
     * @param date 日期 可以传当月的任意天数日期
     * @return
     */
    LocalDate getFirstSignDate(String uid, LocalDate date);


    /**
     * 获取用户当月的签到情况
     *
     * @param userId 用户ID
     * @param date   日期 可以传当月的任意天数日期
     * @return Key 为签到日期，Value 为签到状态的 Map("yyyy-MM-dd", boolean)
     * 返回整月的数据
     */
    Map<String, Boolean> getMonthSignInfo(String userId, LocalDate date);


    /**
     * 获取最近几天的签到情况, 多少天可以放配置文件决定
     *
     * @param userId 用户ID
     * @param date   日期
     * @return Key 为签到日期，Value 为签到状态的 Map("yyyy-MM-dd", boolean)
     */
    Map<String, Boolean> getSignInfoForTheLastFewDays(String userId, LocalDate date);


    /**
     * 获取最近几天的签到情况, 多少天由参数传入决定
     *
     * @param userId      用户ID
     * @param date        日期
     * @param lastFewDays 最近几天
     * @return Key 为签到日期，Value 为签到状态的 Map("yyyy-MM-dd", boolean)
     * 注意:只能到上个月 上上个月的数据会报错
     */
    Map<String, Boolean> getSignInfoForTheLastFewDays(String userId, LocalDate date, int lastFewDays);


    /**
     * 删除指定用户与指定日期的数据 会删除整个月份的数据 慎用
     *
     * @param userId 用户ID
     * @param date   日期
     * @return 已删除的 key 数量
     */
    boolean delSignByUserIdAndDate(String userId, LocalDate date);


    /**
     * 删除指定用户与指定日期的数据 会删除整个月份的数据 慎用
     *
     * @param keyMap k = 用户ID, v = LocalDate
     * @return 已删除的 key 数量
     */
    boolean batchDelSignByUserIdAndDate(Map<String, LocalDate> keyMap);


}
